home *** CD-ROM | disk | FTP | other *** search
/ InterCD 2001 May / may_2001.iso / intercd / root / Multimedia / ^DivX_Article / virtualdub / VirtualDub-source-1_4d / a_sharpen.asm < prev    next >
Encoding:
Assembly Source File  |  2001-03-20  |  8.9 KB  |  587 lines

  1. ;    VirtualDub - Video processing and capture application
  2. ;    Copyright (C) 1998-2001 Avery Lee
  3. ;
  4. ;    This program is free software; you can redistribute it and/or modify
  5. ;    it under the terms of the GNU General Public License as published by
  6. ;    the Free Software Foundation; either version 2 of the License, or
  7. ;    (at your option) any later version.
  8. ;
  9. ;    This program is distributed in the hope that it will be useful,
  10. ;    but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. ;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. ;    GNU General Public License for more details.
  13. ;
  14. ;    You should have received a copy of the GNU General Public License
  15. ;    along with this program; if not, write to the Free Software
  16. ;    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17.  
  18. ;
  19. ;    Why did I write yet another ASM module?
  20. ;
  21. ;    Because I took the OBJ output of Visual C++ 4.0 on maximum optimization,
  22. ;    disassembled it, and said out loud, "God this is sh*tty code!"
  23. ;    (Without the asterisk, to boot.)
  24. ;    That is why.
  25. ;
  26. ;    Hand assembly optimization forever.
  27. ;
  28.  
  29.     .586
  30.     .mmx
  31.     .model    flat
  32.     .code
  33.  
  34.     extern _MMX_enabled : byte
  35.  
  36.     public    _asm_sharpen_run
  37.  
  38. ;asm_sharpen_run(
  39. ;    [esp+ 4] void *dst,
  40. ;    [esp+ 8] void *src,
  41. ;    [esp+12] ulong width,
  42. ;    [esp+16] ulong height,
  43. ;    [esp+20] ulong srcstride,
  44. ;    [esp+24] ulong dststride,
  45. ;    [esp+28] long a_mult,
  46. ;    [esp+32] long b_mult);
  47.  
  48. _asm_sharpen_run:
  49.  
  50.     test    _MMX_enabled,1
  51.     jnz    _asm_sharpen_run_MMX
  52.  
  53.     push    ebp
  54.     push    edi
  55.     push    esi
  56.     push    edx
  57.     push    ecx
  58.     push    ebx
  59.     push    eax
  60.  
  61.     mov    esi,[esp+ 8+28]
  62.     mov    edi,[esp+20+28]
  63.     mov    edx,[esp+ 4+28]
  64.  
  65.     mov    ebp,[esp+16+28]
  66.  
  67. rowloop:
  68.     push    ebp
  69.     mov    ebp,[esp+12+32]
  70.     mov    eax,ebp
  71.     shl    eax,2
  72.     add    esi,eax
  73. colloop:
  74.     push    ebp
  75.     push    edx
  76.  
  77.     mov    eax,[esi-4]
  78.     mov    ebx,[esi+4-4]
  79.     mov    ecx,eax
  80.     mov    edx,ebx
  81.  
  82.     and    eax,00ff00ffh
  83.     and    ebx,00ff00ffh
  84.     and    ecx,0000ff00h
  85.     and    edx,0000ff00h
  86.     add    eax,ebx
  87.     add    ecx,edx
  88.  
  89.     mov    ebx,[esi+edi+4-4]
  90.     mov    edx,ebx
  91.     and    ebx,00ff00ffh
  92.     and    edx,0000ff00h
  93.     add    eax,ebx
  94.     add    ecx,edx
  95.  
  96.     mov    ebx,[esi+edi*2-4]
  97.     mov    edx,ebx
  98.     and    ebx,00ff00ffh
  99.     and    edx,0000ff00h
  100.     add    eax,ebx
  101.     add    ecx,edx
  102.  
  103.     mov    ebx,[esi+edi*2+4-4]
  104.     mov    edx,ebx
  105.     and    ebx,00ff00ffh
  106.     and    edx,0000ff00h
  107.     add    eax,ebx
  108.     add    ecx,edx
  109.  
  110.     mov    ebx,[esi-4-4]
  111.     mov    edx,ebx
  112.     and    ebx,00ff00ffh
  113.     and    edx,0000ff00h
  114.     add    eax,ebx
  115.     add    ecx,edx
  116.  
  117.     mov    ebx,[esi+edi-4-4]
  118.     mov    edx,ebx
  119.     and    ebx,00ff00ffh
  120.     and    edx,0000ff00h
  121.     add    eax,ebx
  122.     add    ecx,edx
  123.  
  124.     mov    ebx,[esi+edi*2-4-4]
  125.     mov    edx,ebx
  126.     and    ebx,00ff00ffh
  127.     and    edx,0000ff00h
  128.     add    eax,ebx
  129.     add    ecx,edx
  130.  
  131.     ;EAX now holds the neighbor sum of red and blue
  132.     ;ECX now holds the neighbor sum of green
  133.  
  134.     mov    ebx,eax
  135.     mov    ebp,[esi+edi-4]
  136.     shr    ebx,16
  137.     and    eax,0000ffffh
  138.     imul    eax,[esp+28+40]
  139.     imul    ebx,[esp+28+40]
  140.     imul    ecx,[esp+28+40]
  141.  
  142.     push    esi
  143.     push    edi
  144.  
  145.     mov    edx,ebp
  146.     mov    esi,ebp
  147.     shr    ebp,16
  148.     and    edx,000000ffh
  149.     and    ebp,000000ffh
  150.     and    esi,0000ff00h
  151.     imul    edx,[esp+32+48]
  152.     imul    esi,[esp+32+48]
  153.     imul    ebp,[esp+32+48]
  154.     add    eax,edx
  155.     add    ecx,esi
  156.     add    ebx,ebp
  157.  
  158.     mov    edx,edx
  159.  
  160.     ;(ESI,EDX):
  161.     ;    00010000-7FFFFFFF    11
  162.     ;    00000000-0000FFFF    10
  163.     ;    80000000-FFFFFFFF    00
  164.  
  165.     mov    esi,eax        ;b1 u
  166.     mov    edi,ebx        ;r1 v
  167.     xor    esi,-1        ;b2 u
  168.     xor    edi,-1        ;r2 v
  169.     mov    edx,esi        ;b3 u
  170.     mov    ebp,edi        ;r3 v
  171.     sar    esi,31        ;b4 u
  172.     add    edx,00010000h    ;b5 v
  173.     sar    edi,31        ;r4 u
  174.     add    ebp,00010000h    ;r5 v
  175.     sar    edx,31        ;b6 u
  176.     and    eax,esi        ;b7 v
  177.     sar    ebp,31        ;r6 u
  178.     mov    esi,ecx        ;g1 v
  179.     and    ebx,edi        ;r7 u
  180.     xor    esi,-1        ;g2 v
  181.     or    eax,edx        ;b8 u
  182.     mov    edx,esi        ;g3 v
  183.     sar    esi,31        ;g4 u
  184.     add    edx,01000000h    ;g5 v
  185.     and    ecx,esi        ;g6 u
  186.     or    ebx,ebp        ;r8 v
  187.     sar    edx,31        ;g7 u
  188.     and    ebx,0000ff00h    ;   v
  189.     shl    ebx,8        ;   u
  190.     or    ecx,edx        ;g8 v
  191.     shr    eax,8        ;   u
  192.     and    ecx,00ff0000h    ;   v
  193.     shr    ecx,8        ;   u
  194.     pop    edi        ;   v
  195.     pop    esi        ;   u
  196.     and    eax,000000ffh    ;   v
  197.     pop    edx        ;   u
  198.     or    eax,ecx        ;   v
  199.     pop    ebp        ;   u
  200.     or    eax,ebx        ;   v
  201.     sub    esi,4        ;   u
  202.     mov    [edx+ebp*4-4],eax    ;v
  203.     dec    ebp
  204.     jne    colloop
  205.  
  206.     pop    ebp
  207.  
  208.     add    esi,edi
  209.     add    edx,[esp+24+28]
  210.  
  211.     dec    ebp
  212.     jne    rowloop
  213.  
  214.     pop    eax
  215.     pop    ebx
  216.     pop    ecx
  217.     pop    edx
  218.     pop    esi
  219.     pop    edi
  220.     pop    ebp
  221.     ret
  222.  
  223. ;*********
  224.  
  225. _asm_sharpen_run_MMX:
  226.     push    ebp
  227.     push    edi
  228.     push    esi
  229.     push    edx
  230.     push    ecx
  231.     push    ebx
  232.     push    eax
  233.  
  234.     mov    esi,[esp+ 8+28]
  235.     mov    edi,[esp+20+28]
  236.     mov    edx,[esp+ 4+28]
  237.  
  238.     mov    ebp,[esp+16+28]
  239.  
  240.     ;mm5: neighbor multiplier
  241.     ;mm6: center multiplier
  242.     ;mm7: zero
  243.  
  244.     pxor    mm7,mm7
  245.  
  246.     mov    eax,[esp+28+28]
  247.     neg    eax
  248.     shr    eax,2
  249.     mov    ebx,eax
  250.     shl    ebx,16
  251.     or    eax,ebx
  252.     movd    mm0,eax
  253.     movd    mm5,eax
  254.     psllq    mm5,32
  255.     por    mm5,mm0
  256.  
  257.     mov    eax,[esp+32+28]
  258.     shr    eax,2
  259.     and    eax,0000fff8h
  260.     mov    ebx,eax
  261.     shl    ebx,16
  262.     or    eax,ebx
  263.     movd    mm0,eax
  264.     movd    mm6,eax
  265.     psllq    mm6,32
  266.     por    mm6,mm0
  267.  
  268. rowloop_MMX:
  269.     push    ebp
  270.     push    edx
  271.     push    esi
  272.     mov    ebp,[esp+12+40]
  273.  
  274.     movd    mm0,[esi-4]
  275.     punpcklbw mm0,mm7
  276.  
  277.     movq    mm1,[esi]
  278.     movq    mm2,mm1
  279.     punpcklbw mm1,mm7
  280.     punpckhbw mm2,mm7
  281.     paddw    mm0,mm1
  282.     paddw    mm0,mm2
  283.  
  284.     movd    mm1,[esi+edi*2-4]
  285.     punpcklbw mm1,mm7
  286.     paddw    mm0,mm1
  287.  
  288.     movq    mm1,[esi+edi*2]
  289.     movq    mm2,mm1
  290.     punpcklbw mm1,mm7
  291.     punpckhbw mm2,mm7
  292.     paddw    mm0,mm1
  293.     paddw    mm0,mm2
  294.  
  295.     movd    mm1,[esi+edi-4]
  296.     punpcklbw mm1,mm7
  297.     movd    mm2,[esi+edi+4]
  298.     punpcklbw mm2,mm7
  299.     paddw    mm1,mm2
  300.     paddw    mm1,mm0
  301.     pmullw    mm1,mm5
  302.  
  303.     movd    mm2,[esi+edi]
  304.     punpcklbw mm2,mm7
  305.     pmullw    mm2,mm6
  306.     psubusw    mm2,mm1
  307.     psrlw    mm2,6
  308.     packuswb mm2,mm2
  309.     movd    [edx],mm2
  310.  
  311.     add    esi,4
  312.     dec    ebp
  313.  
  314.     movd    mm1,[esi+4]
  315.     add    edx,4
  316.     movd    mm4,[esi+edi*2+4]
  317.     punpcklbw mm1,mm7
  318.     punpcklbw mm4,mm7
  319.     paddw    mm0,mm1
  320.     movd    mm1,[esi-8]
  321.     movd    mm2,[esi+edi*2-8]
  322.     punpcklbw mm1,mm7
  323.     paddw    mm0,mm4
  324.  
  325.     jmp    colloop_MMX_entry
  326.  
  327. colloop_MMX:
  328.     movd    mm1,[esi+4]
  329.     add    edx,4
  330.  
  331.     movd    mm4,[esi+edi*2+4]
  332.     punpcklbw mm1,mm7
  333.  
  334.     psubusw    mm3,mm2
  335.     punpcklbw mm4,mm7
  336.  
  337.     psrlw    mm3,6
  338.     paddw    mm0,mm1
  339.  
  340.     movd    mm1,[esi-8]
  341.     packuswb mm3,mm3
  342.  
  343.     movd    mm2,[esi+edi*2-8]
  344.     punpcklbw mm1,mm7
  345.  
  346.     movd    [edx-4],mm3
  347.     paddw    mm0,mm4
  348.  
  349. colloop_MMX_entry:
  350.  
  351.     punpcklbw mm2,mm7
  352.     psubw    mm0,mm1
  353.  
  354.     movd    mm1,[esi+edi-4]
  355.     psubw    mm0,mm2
  356.  
  357.     movd    mm2,[esi+edi+4]
  358.     punpcklbw mm1,mm7
  359.  
  360.     movd    mm3,[esi+edi]
  361.     punpcklbw mm2,mm7
  362.  
  363.     punpcklbw mm3,mm7
  364.     paddw    mm1,mm0
  365.  
  366.     pmullw    mm3,mm6
  367.     paddw    mm2,mm1
  368.  
  369.     pmullw    mm2,mm5
  370.     add    esi,4
  371.  
  372.     dec    ebp
  373.     jne    colloop_MMX
  374.  
  375.     psubusw    mm3,mm2
  376.     psrlw    mm3,6
  377.     packuswb mm3,mm3
  378.     movd    [edx],mm3
  379.  
  380.     pop    esi
  381.     pop    edx
  382.     pop    ebp
  383.  
  384.     add    esi,edi
  385.     add    edx,[esp+24+28]
  386.  
  387.     dec    ebp
  388.     jne    rowloop_MMX
  389.  
  390.     pop    eax
  391.     pop    ebx
  392.     pop    ecx
  393.     pop    edx
  394.     pop    esi
  395.     pop    edi
  396.     pop    ebp
  397.     emms
  398.     ret
  399.  
  400.     IF 0
  401.  
  402. ;********************************
  403.  
  404.     movd    mm0,[esi-4]
  405.     punpcklbw mm0,mm7
  406.  
  407.     movq    mm1,[esi]
  408.     movq    mm2,mm1
  409.     punpcklbw mm1,mm7
  410.     punpckhbw mm2,mm7
  411.     paddw    mm0,mm1
  412.     paddw    mm0,mm2
  413.  
  414.     movd    mm1,[esi+edi*2-4]
  415.     punpcklbw mm1,mm7
  416.     paddw    mm0,mm1
  417.  
  418.     movq    mm1,[esi+edi*2]
  419.     movq    mm2,mm1
  420.     punpcklbw mm1,mm7
  421.     punpckhbw mm2,mm7
  422.     paddw    mm0,mm1
  423.     paddw    mm0,mm2
  424.  
  425.     movd    mm1,[esi+edi-4]
  426.     punpcklbw mm1,mm7
  427.     movd    mm2,[esi+edi+4]
  428.     punpcklbw mm2,mm7
  429.     paddw    mm1,mm2
  430.     paddw    mm1,mm0
  431.     pmullw    mm1,mm5
  432.  
  433.     movd    mm2,[esi+edi]
  434.     punpcklbw mm2,mm7
  435.     pmullw    mm2,mm6
  436.     psubw    mm2,mm1
  437.     psrlw    mm2,6
  438.     packuswb mm2,mm2
  439.     movd    [edx],mm2
  440.  
  441.     add    esi,4
  442.     dec    ebp
  443.  
  444.     movd    mm1,[esi+4]
  445.     movd    mm2,[esi+edi*2+4]
  446.     punpcklbw mm1,mm7
  447.     punpcklbw mm2,mm7
  448.     paddw    mm0,mm1
  449.     add    edx,4
  450.     jmp    colloop_MMX_entry
  451.  
  452. colloop_MMX:
  453.     movd    mm1,[esi+4]
  454.     psubusw    mm3,mm2
  455.  
  456.     movd    mm2,[esi+edi*2+4]
  457.     psrlw    mm3,6
  458.  
  459.     punpcklbw mm1,mm7
  460.     packuswb mm3,mm3
  461.  
  462.     punpcklbw mm2,mm7
  463.     paddw    mm0,mm1
  464.  
  465.     movd    [edx-4],mm3
  466.     add    edx,4
  467.  
  468. colloop_MMX_entry:
  469.     movd    mm1,[esi-8]
  470.     paddw    mm0,mm2
  471.  
  472.     movd    mm2,[esi+edi*2-8]
  473.     punpcklbw mm1,mm7
  474.  
  475.     punpcklbw mm2,mm7
  476.     psubw    mm0,mm1
  477.  
  478.     movd    mm1,[esi+edi-4]
  479.     psubw    mm0,mm2
  480.  
  481.     movd    mm2,[esi+edi+4]
  482.     punpcklbw mm1,mm7
  483.  
  484.     movd    mm3,[esi+edi]
  485.     punpcklbw mm2,mm7
  486.  
  487.     punpcklbw mm3,mm7
  488.     paddw    mm1,mm0
  489.  
  490.     pmullw    mm3,mm6
  491.     paddw    mm2,mm1
  492.  
  493.     pmullw    mm2,mm5
  494.     add    esi,4
  495.  
  496.     dec    ebp
  497.     jne    colloop_MMX
  498.  
  499. ;*****************************************
  500.  
  501.     movd    mm1,[esi+4]
  502.     add    edx,4
  503.  
  504.     movd    mm2,[esi+edi*2+4]
  505.     punpcklbw mm1,mm7
  506.  
  507.     punpcklbw mm2,mm7
  508.     paddw    mm0,mm1
  509.  
  510.     movd    mm1,[esi-8]
  511.     paddw    mm0,mm2
  512.  
  513.     movd    mm2,[esi+edi*2-8]
  514.     punpcklbw mm1,mm7
  515.  
  516.     punpcklbw mm2,mm7
  517.     psubw    mm0,mm1
  518.  
  519.     movd    mm1,[esi+edi-4]
  520.     psubw    mm0,mm2
  521.  
  522.     movd    mm2,[esi+edi+4]
  523.     punpcklbw mm1,mm7
  524.  
  525.     movd    mm3,[esi+edi]
  526.     punpcklbw mm2,mm7
  527.  
  528.     punpcklbw mm3,mm7
  529.     paddw    mm1,mm0
  530.  
  531.     pmullw    mm3,mm6
  532.     paddw    mm1,mm2
  533.  
  534.     pmullw    mm1,mm5
  535.     add    esi,4
  536.  
  537.     psubusw    mm3,mm1
  538.  
  539.     psrlw    mm3,6
  540.  
  541.     packuswb mm3,mm3
  542.     dec    ebp
  543.  
  544.     movd    [edx-4],mm3
  545.     jne    colloop_MMX
  546.  
  547. ;**************************
  548.  
  549.     movd    mm1,[esi+4]
  550.     punpcklbw mm1,mm7
  551.     paddw    mm0,mm1
  552.     movd    mm1,[esi+edi*2+4]
  553.     punpcklbw mm1,mm7
  554.     paddw    mm0,mm1
  555.     movd    mm1,[esi-8]
  556.     punpcklbw mm1,mm7
  557.     psubw    mm0,mm1
  558.     movd    mm1,[esi+edi*2-8]
  559.     punpcklbw mm1,mm7
  560.     psubw    mm0,mm1
  561.  
  562.     movd    mm1,[esi+edi-4]
  563.     punpcklbw mm1,mm7
  564.     movd    mm2,[esi+edi+4]
  565.     punpcklbw mm2,mm7
  566.     paddw    mm1,mm2
  567.     paddw    mm1,mm0
  568.     pmullw    mm1,mm5
  569.  
  570.     movd    mm2,[esi+edi]
  571.     punpcklbw mm2,mm7
  572.     pmullw    mm2,mm6
  573.     psubusw    mm2,mm1
  574.     psrlw    mm2,6
  575.     packuswb mm2,mm2
  576.     movd    [edx],mm2
  577.  
  578.     add    esi,4
  579.     add    edx,4
  580.  
  581.     dec    ebp
  582.     jne    colloop_MMX
  583.  
  584.     ENDIF
  585.  
  586.     end
  587.